package com.leetcode.根据数据结构分类.数组;

/**
 * @author: xiaomi
 * @date: 2021/3/22
 * @description: 191. 位1的个数
 * https://leetcode-cn.com/problems/number-of-1-bits/
 */
public class A_191_位1的个数 {

    static A_191_位1的个数 action = new A_191_位1的个数();

    public static void main(String[] args) {
        test1();
    }

    static void test1() {
        int n = 00000000000000000000000000001011;
        //为何输入会是 521
        int res = action.hammingWeight1(n);
        System.out.println(res);
    }


    /**
     * 既然输入是 int 类型的二进制串，那么想要得到每一位只能进行 除 10 了
     * 这个思路是错的，具体原因不明，但是说明如果输入是二进制串 int ，那么只能当成二进制来处理
     *
     * @param n
     * @return
     */
    public int hammingWeightFail(int n) {
        int value = n;
        int num = 0;
        int count = 0;
        while (value > 0) {
            num = value % 10;
            if (num == 1) {
                count++;
            }
            value = value / 10;
        }
        return count;
    }

    /**
     * 通过比较每一位
     *
     * @param n
     * @return
     */
    public int hammingWeight1(int n) {
        int res = 0;
        //每一位进行检查
        for (int i = 0; i < 32; i++) {
            //将 1 进行移位,每一次比较不同的位数
            int i1 = n & (1 << i);
            if (i1 != 0) {
                res++;
            }
        }
        return res;
    }

    /**
     * 位运算优化：
     * n&(n-1) 即将 n 的最低位的 1 转为 0
     * 需要注意符号位
     * @param n
     * @return
     */
    public int hammingWeight2(int n) {
        int res = 0;
        while (n != 0) {
            n &= (n - 1);
            res++;
        }
        return res;
    }
}
